package com.example.demo.config;

import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.example.demo.entity.ReturnData;
import com.example.demo.utils.JWTUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在接口控制器方法处理请求之前执行的代码
        // 可以返回true继续处理，或者返回false中断请求
        System.out.println("处理请求之前执行的代码");
        System.out.println("本次请求地址是："+request.getRequestURI());
        if(handler instanceof HandlerMethod) {//判断是否是接口的请求，如果不是接口，则放行
            System.out.println("本次请求被拦截");
            //设置请求内容的编码，防止乱码
            response.setContentType("application/json;charset=utf-8");
            response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有域名跨域访问
            response.setHeader("Access-Control-Allow-Headers", "Content-Type"); // 允许的请求头

            String token = request.getHeader("token");
            if(token==null || token.equals("")){
                PrintWriter out = response.getWriter();
                out.print(JSON.toJSONString(ReturnData.error("请先登录")));//避免没有返回响应，返回被拦截的信息
                return false;
            }
            try{
                JWTUtils.getIdByToken(token);
            }catch (Exception e){
                PrintWriter out = response.getWriter();

                ReturnData returnData = ReturnData.error("token无效，请重新登录");
                out.print(JSON.toJSONString(returnData));//避免没有返回响应，返回被拦截的信息
                return false;//拦截
            }
           return true;//放行
        }
        System.out.println("本次请求被放行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在接口控制器方法处理请求之后，但在视图被渲染之前执行的代码
        // 如果控制器方法没有返回值（即没有视图），则modelAndView可以为null
        System.out.println("在接口控制器方法处理请求之后，但在视图被渲染之前执行的代码");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在整个请求处理完成之后执行的代码（包括视图渲染）
        // 可以在这里进行清理工作，或者记录日志等
        System.out.println("在整个请求处理完成之后执行的代码");
    }
}